#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
int n, m, L, V, p[maxn];
struct BIT {
    int arr[maxn];
    void add(int x, int y) {
        while (x <= L) {
            arr[x] += y;
            x += x & (-x);
        }
    }
    int ask(int x) {
        int ret = 0;
        while (x) {
            ret += arr[x];
            x -= x & (-x);
        }
        return ret;
    }
} bt;
struct seg {
    int l, r;
};
void solve() {
    scanf("%d %d %d %d", &n, &m, &L, &V);
    vector<seg> vec;
    for (int i = 1; i <= n; i++) {
        int d, v, a;
        scanf("%d %d %d", &d, &v, &a);
        if (a == 0) {
            if (v > V) {
                // cout << i << ' ' << d << ' ' << L << '\n';
                vec.push_back((seg){d, L});
            }
        } else if (a > 0) {
            if (v > V) {
                // cout << i << ' ' << d << ' ' << L << '\n';
                vec.push_back((seg){d, L});
            } else {
                int s = (V * V - v * v) / (a * 2) + 1;
                if (s <= L - d) {
                    // cout << i << ' ' << d + s << ' ' << L << '\n';
                    vec.push_back((seg){d + s, L});
                }
            }
        } else {
            if (v > V) {
                int s = (v * v - V * V + (-a) * 2 - 1) / (-a * 2) - 1;
                // cout << i << ' ' << d << ' ' << min(d + s, L) << '\n';
                vec.push_back((seg){d, min(d + s, L)});
            }
        }
    }
    for (int i = 1; i <= m; i++) {
        scanf("%d", &p[i]);
    }
    int ans1 = 0;
    bool suf = 1;
    for (seg &i : vec) {
        i.l = lower_bound(p + 1, p + m + 1, i.l) - p;
        i.r = upper_bound(p + 1, p + m + 1, i.r) - p - 1;
        if (i.l <= i.r) {
            suf &= i.r == m;
            ans1++;
        }
    }
    if (suf) {
        if (ans1) {
            printf("%d %d\n", ans1, m - 1);
        } else {
            printf("%d %d\n", ans1, m);
        }
        return;
    }
    int ans2 = 0;
    for (int i = 0; i < (1 << m); i++) {
        for (int i = 1; i <= m; i++) {
            bt.arr[i] = 0;
        }
        for (int j = 0; j < m; j++) {
            if ((i >> j) & 1) {
                bt.add(j + 1, 1);
            }
        }
        bool flg = 1;
        for (seg j : vec) {
            if (j.l <= j.r) {
                flg &= bt.ask(j.r) - bt.ask(j.l - 1) > 0;
            }
        }
        if (flg) {
            ans2 = max(ans2, m - __builtin_popcount(i));
        }
    }
    printf("%d %d\n", ans1, ans2);
}
int main() {
    freopen("detect.in", "r", stdin);
    freopen("detect.out", "w", stdout);
    int T;
    scanf("%d", &T);
    while (T--) {
        solve();
    }
    return 0;
}